/**
 * 根据指定的键值路径 strKeys，查找对象 obj，并设置数据 data
 * @param {Object} obj 组件配置对象
 * @param {String} strKeys 需要设置的键值路径
 * @param {Any} data 数据
 */
export function setObjectValueReduce(obj, strKeys, data) {
  const arr = strKeys.split('.')
  arr.reduce((pre, item, i) => {
    if (arr.length === i + 1) {
      pre[item] = data
    } else if (!isObjectObject(pre[item])) {
      pre[item] = {}
    }
    return pre[item]
  }, obj)
}

/**
 * 动态数据类型的组件，用户设置获取的数据
 * @param {Object} component 组件完整配置
 * @param {Array|Object} resp 动态数据所需要设置的数据
 * @returns 
 */
export function setRespData(component, resp) {
  const { dataPath, dataConsumer } = component.__config__
  // if (!dataPath || !dataConsumer) return
  // const respData = dataPath.split('.').reduce((pre, item) => pre[item], resp)
  // 当 dataPath 为空时， 直接取 response.data，此时的数据格式就是想要的数据
  if (!dataConsumer) return
  let respData = resp;
  if (dataPath) {
    respData = dataPath.split('.').reduce((pre, item) => pre[item], resp)
  }

  // 将请求回来的数据，赋值到指定属性。
  // 以el-tabel为例，根据Element文档，应该将数据赋值给el-tabel的data属性，所以dataConsumer的值应为'data';
  // 此时赋值代码可写成 component[dataConsumer] = respData；
  // 但为支持更深层级的赋值（如：dataConsumer的值为'options.data'）,使用setObjectValueReduce
  setObjectValueReduce(component, dataConsumer, respData)
  /* const i = this.drawingList.findIndex(item => item.__config__.renderKey === renderKey)
  if (i > -1) this.$set(this.drawingList, i, component) */
}

function setLoading(component, val) {
  const { directives } = component
  if (Array.isArray(directives)) {
    const t = directives.find(d => d.name === 'loading')
    if (t) t.value = val
  }
}

/**
 * 
 * @param {Object} component 组件完整配置
 * @param {Function} callback 获取数据后，组件配置更新完毕后的回调函数
 */
export function fetchData(component, callback) {
  const { dataType, method, url } = component.__config__
  if (dataType === 'dynamic' && method && url) {
    setLoading(component, true)
    this.$axios({
      method,
      url
    }).then(resp => {
      setLoading(component, false)
      setRespData.call(this, component, resp)
      callback && callback(component)
    })
  }
}
